//
// Created by 啊汤哥 on 2025/6/22.
//


#include <stdio.h>
#include <stdlib.h>

typedef struct LNode {
    int data;
    struct LNode *next;
} LNode, *LinkList;


bool InitList(LinkList &L) {
    L = (LNode*)malloc(sizeof(L));
    if (L == NULL) {
        return false;
    }
    L->next = NULL;
    return true;
}


// 插入 -- 指定位置插入 链表 那个位置 对应的值
bool LinkInsert(LinkList &L, int i, int e) {
    LNode *newNode, * curNode;
    if (i<1) return false;

    curNode = L; // 从头节点开始
    int j = 0;
    while (curNode!=NULL && j<j-1) {
        curNode = curNode->next;
        j++;
    }
    // 如果curNode为NULL，说明插入位置超过了链表长度
    if (curNode == NULL) return false;

    newNode = (LNode*)malloc(sizeof(LNode)); // 分配新节点
    newNode->data = e; // 设置新节点的数据
    newNode->next = curNode->next; // 新节点指向当前节点的下一个节点
    curNode->next = newNode; // 当前节点指向新节点

}

// 指定节点的后插操作
bool InsertNextNode(LNode *p, int e) {
    if (p == NULL) return false; // 检查节点是否为空
    LNode *nodeNew = new LNode; // 分配新节点
    if (nodeNew == NULL) return false; // 检查内存分配是否成功

    nodeNew->data = e; // 设置新节点的数据
    nodeNew->next = p->next; // 新节点指向当前节点的下一个节点
    p->next = nodeNew; // 当前节点指向新节点
    return true;
}

// 删除第i个元素返回这个值
bool LinkDelete(LinkList &L, int i, int &e) {
    if (i < 1) return false; // 检查删除位置是否合法
    LNode *curNode, *delNode;
    curNode = L;
    int j = 0;
    while (curNode != NULL && j < i - 1) { // 寻找第i-1个节点
        curNode = curNode->next;
        j++;
    }
    if (curNode == NULL || curNode->next == NULL) return false; // 检查删除位置是否合法

    delNode = curNode->next; // 找到要删除的节点
    e = delNode->data; // 将要删除节点的值赋给e
    curNode->next = delNode->next; // 从链表中删除节点
    delete delNode; // 释放被删除节点的内存
    return true;
}



// 按位查询 -- 返回的第i个元素  * 表示的意思是 -> 返回函数GetElement 指向LNode类型的对象指针
LNode * GetElement(LinkList L, int i) {
    if (i < 1) return NULL; // 检查位置是否合法
    LNode *p = L; // 从头节点开始
    int j = 0;
    while (p != NULL && j < i) { // 寻找第i个节点
        p = p->next;
        j++;
    }
    return p;
}

// 按值查询找到数据 -- e的这个节点 value 查询值

LNode * LocateValueElement(LinkList L, int value) {
    LNode *p = L->next; // 从头节点开始查找
    while (p != NULL && p->data != value) {
        p = p->next; // 移动到下一个节点
    }
    return p;
}

// 求表的长度

int SingleLength(LinkList L) {
    int len = 0;
    LNode *p = L;
    while (p->next != NULL) {
        p = p->next;
        len++;
    }
    return len;
}

// 尾插法建立单链表
LinkList List_TailInsert(LinkList &L) {
    int x;
    L = new LNode; // 分配头节点的内存
    LNode *nodeNew, *tailNext = L;
    scanf("%d", &x);
    while (x != 10) {
        nodeNew = new LNode; // 分配新节点的内存
        nodeNew->data = x;
        tailNext->next = nodeNew;
        tailNext = nodeNew;
        scanf("%d", &x);
    }
    tailNext->next = NULL; // 将尾节点的next置为NULL
    return L;
}

// 头插法建立单链表
LinkList List_HeadInsert(LinkList &L) {
    LNode *nodeNew;
    int x;
    // 创建头结点
    L = new LNode; // 分配头节点的内存
    L->next = NULL;
    scanf("%d", &x);
    while (x != 10) {
        nodeNew = new LNode; // 分配新节点的内存
        nodeNew->data = x;
        nodeNew->next = L->next;
        L->next = nodeNew;
        scanf("%d", &x);
    }
    return L;
}
